package com.zhuangjie.base.entity;

import com.zhaungjie.base.utils.LocalTimeOperations;
import lombok.Data;

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Objects;

/**
 * Time范围
 * （默认且固定格式：HH:mm）
 * @author zhuangjie
 * @date 2023/11/16
 */
@Data
public class TimeRange {
    // HH:mm格式
    private String startTime;
    // HH:mm格式
    private String endTime;



    /**
     * 看指定time是否在this的TimeRange的范围内
     *
     * @param time 指定时间，格式为HH:mm
     * @return {@link Boolean}
     */
    public Boolean in(String time) {
        if (!time.contains(":")) throw new RuntimeException("传入的time格式不正确！");
        // Assuming time is provided in the format HH:mm
        return (time.equals(startTime) || time.compareTo(startTime) > 0)
                && (time.equals(endTime) || time.compareTo(endTime) < 0);
    }

    public Boolean in(LocalTime time) {
        if (time == null) return false;
        // 定义DateTimeFormatter，指定格式为HH:mm
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
        // 使用format方法将LocalTime对象格式化为字符串
        return in(time.format(formatter));
    }


    public TimeRange() {
    }

    public TimeRange(String startTime, String endTime) {
        if (startTime != null && !isValidTime(startTime.trim())) {
            throw new RuntimeException("开始时间格式不正确！，无法构造TimeRange对象！");
        }
        if (endTime != null && !isValidTime(endTime.trim())) {
            throw new RuntimeException("结束时间格式不正确！，无法构造TimeRange对象！");
        }
        this.startTime = startTime;
        this.endTime = endTime;
    }



    /**
     * 构造函数
     *
     * @param startAndEndTime 开始和结束时间
     * @param separator       分隔符
     * @return {@link TimeRange}
     */
    public static TimeRange constructor(String startAndEndTime, String separator) {
        if (!isValidTimeRange(startAndEndTime, separator)) {
            throw new RuntimeException("时间格式不正确！");
        }
        String[] arr = startAndEndTime.split(separator);
        return new TimeRange(arr[0], arr[1]);
    }


    /**
     * 是有效时间范围格式
     *
     * @param startAndEndTime 开始和结束时间
     * @param separator       分离器
     * @return boolean
     */
    public static boolean isValidTimeRange(String startAndEndTime, String separator) {
        // HH:mm${separator}HH:hh
        String[] times = startAndEndTime.split(separator);
        if (times.length != 2) return false;
        // 检查小时的合法性与分钟的合法性
        for (String time : times) {
            if (!isValidTime(time)) {
                return false;
            }
        }
        // 检查startTime是否在endTime之前
        return times[0].compareTo(times[1]) <= 0;
    }

    /**
     * 是有效时间格式
     *
     * @param time 时间
     * @return boolean
     */
    public static boolean isValidTime(String time) {
        if (time == null || !time.contains(":")) return false;
        String[] hhMM = time.split(":");
        if (hhMM.length != 2) return false;
        Byte hh = Byte.valueOf(hhMM[0]);
        Byte mm = Byte.valueOf(hhMM[1]);
        return !(hh < 0 || hh > 23 || mm < 0 || mm > 59);
    }


    public String getStartTime() {
        return startTime;
    }

    public void setStartTime(String startTime) {
        this.startTime = startTime;
    }

    public String getEndTime() {
        return endTime;
    }

    public void setEndTime(String endTime) {
        this.endTime = endTime;
    }

    @Override
    public int hashCode() {
        return Objects.hash(startTime, endTime);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;

        TimeRange other = (TimeRange) obj;

        return Objects.equals(startTime, other.startTime) && Objects.equals(endTime, other.endTime);
    }

    public boolean inLeft(LocalTime time) {
        if (time == null || startTime == null) return false;
        return new LocalTimeOperations(time).toNumberValue().compareTo(new LocalTimeOperations(startTime).toNumberValue()) < 0;
    }
}
